#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ОтчетОбъект     = РеквизитФормыВЗначение("Отчет");
	НастройкиОтчета = НастройкиОтчета(ОтчетОбъект);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
	
	СтандартнаяОбработка = Ложь;
	
	// Получаем данные расшифровки
	Данные = ДанныеЭлементаРасшифровки(Расшифровка);
	
	// Проверяем, что в расшифровке есть данные об объекте метаданных
	Если НеобходимыеОтборыНайдены(Данные) Тогда 
		
		// Создаем меню с пунктом "Открыть список объектов"
		СписокВыбора = Новый СписокЗначений;
		СписокВыбора.Добавить("ОткрытьСписок", "Показать список");
		
		ОповещениеОВыборе = Новый ОписаниеОповещения("ОбработкаВыбораДействияРасшифровки", ЭтотОбъект, Данные);
		СписокВыбора.ПоказатьВыборЭлемента(ОповещениеОВыборе);
		
		Возврат;
		
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область ЗаимствованныеИзБСП_3_1_11_215

// см. ОбщаяФорма.ФормаОтчета
&НаСервере
Функция НастройкиОтчета(ОтчетОбъект)
	
	Настройки = НастройкиФормыОтчета(Параметры.Отчет, КлючТекущегоВарианта, ОтчетОбъект);
	Настройки.АдресСхемы = АдресСхемыОтчета(ОтчетОбъект);
	Настройки.Контекстный = ЗначениеЗаполнено(КонтекстВарианта) И Не Параметры.Неконтекстный;
	Настройки.ИспользуемыеТаблицы = СвойствоСтруктуры(Параметры, "ИспользуемыеТаблицы");
	Настройки.СобытияНастроек = СобытияНастроек();
	Настройки.ИспользоватьСнимкиОтчетов = ПравоДоступа("МобильныйКлиент", Метаданные);
	
	Возврат Настройки;
	
КонецФункции                 

// см. ОМ.ОбщегоНазначенияКлиентСервер 
&НаСервере
Функция СвойствоСтруктуры(Структура, Ключ, ЗначениеПоУмолчанию = Неопределено)
	
	Если Структура = Неопределено Тогда
		Возврат ЗначениеПоУмолчанию;
	КонецЕсли;
	
	Результат = ЗначениеПоУмолчанию;
	Если Структура.Свойство(Ключ, Результат) Тогда
		Возврат Результат;
	Иначе
		Возврат ЗначениеПоУмолчанию;
	КонецЕсли;
	
КонецФункции

// см. ОбщаяФорма.ФормаОтчета
&НаСервере
Функция АдресСхемыОтчета(ОтчетОбъект)
	АдресСхемы = СвойствоСтруктуры(Параметры, "АдресСхемы", "");

	Расшифровка = СвойствоСтруктуры(Параметры, "Расшифровка");

	Если ТипЗнч(Расшифровка) = Тип("ОписаниеОбработкиРасшифровкиКомпоновкиДанных") Тогда
		Настройки = ПолучитьИзВременногоХранилища(Расшифровка.Данные).Настройки;
		АдресСхемы = СвойствоСтруктуры(Настройки.ДополнительныеСвойства, "АдресСхемы", "");
	КонецЕсли;

	ЭтоСхема = Ложь;
	Если ЭтоАдресВременногоХранилища(АдресСхемы) Тогда
		Схема = ПолучитьИзВременногоХранилища(АдресСхемы);
		ЭтоСхема = (ТипЗнч(Схема) = Тип("СхемаКомпоновкиДанных"));

		Если ЭтоСхема Тогда
			АдресСхемы = ПоместитьВоВременноеХранилище(Схема, УникальныйИдентификатор);
			Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы));
		КонецЕсли;
	КонецЕсли;

	Если Не ЭтоСхема Тогда
		АдресСхемы = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, УникальныйИдентификатор);
	КонецЕсли;

	Возврат АдресСхемы;
КонецФункции

#Область СобытияНастроек

// см. ОбщаяФорма.ФормаОтчета
&НаСервере
Функция СобытияНастроек()

	СобытияНастроек = Новый Соответствие;

	НайтиСобытияНастроек(Элементы.ОтчетТабличныйДокумент.КонтекстноеМеню, УточненияСобытийНастроек(), 
		СобытияНастроекИсключения(), СобытияНастроек);

	СобытияНастроек.Вставить("ФильтроватьИСформировать", НСтр("ru = 'Фильтровать...'"));
	СобытияНастроек.Вставить(ИмяСобытияФормыНастроек(), 
		НСтр("ru = 'Расширенная настройка'"));
	СобытияНастроек.Вставить(ИмяСобытияИзмененияСоставаБыстрыхНастроек(), 
		НСтр("ru = 'Изменение состава быстрых настроек'"));

	Возврат СобытияНастроек;

КонецФункции

// см. ОМ.ВариантыОтчетовСлужебныйКлиентСервер
&НаСервере
Функция ИмяСобытияФормыНастроек() 
	
	Возврат "ФормаНастроек";
	
КонецФункции

// см. ОМ.ВариантыОтчетовСлужебныйКлиентСервер
&НаСервере
Функция ИмяСобытияИзмененияСоставаБыстрыхНастроек() 
	
	Возврат "ИзменитьСоставБыстрыхНастроек";
	
КонецФункции

// см. ОбщаяФорма.ФормаОтчета
&НаСервере
Функция УточненияСобытийНастроек()

	Префиксы = Новый Соответствие;
	Префиксы.Вставить("ОформитьЖелтым", НСтр("ru = 'Оформить желтым'"));
	Префиксы.Вставить("ОформитьКрасным", НСтр("ru = 'Оформить красным'"));
	Префиксы.Вставить("ОформитьЗеленым", НСтр("ru = 'Оформить зеленым'"));
	Префиксы.Вставить("ОформитьЕще", НСтр("ru = 'Оформить (еще)'"));

	Возврат Префиксы;

КонецФункции

// см. ОбщаяФорма.ФормаОтчета
&НаСервере
Функция СобытияНастроекИсключения()

	Исключения = Новый Массив;
	Исключения.Добавить("Открыть");
	Исключения.Добавить("РасшифроватьПоДетальнымЗаписям");
	Исключения.Добавить("Расшифровать");
	Исключения.Добавить("Подключаемый_ПоказатьУровеньГруппировок");
	Исключения.Добавить("ОтчетСкомпоноватьРезультат");

	Возврат Исключения;

КонецФункции

// см. ОбщаяФорма.ФормаОтчета
&НаСервере
Процедура НайтиСобытияНастроек(Меню, Уточнения, Исключения, СобытияНастроек)

	Для Каждого Элемент Из Меню.ПодчиненныеЭлементы Цикл

		Если ТипЗнч(Элемент) = Тип("ГруппаФормы") Тогда

			НайтиСобытияНастроек(Элемент, Уточнения, Исключения, СобытияНастроек);

		ИначеЕсли СобытияНастроек[Элемент.ИмяКоманды] = Неопределено 
			И Исключения.Найти(Элемент.ИмяКоманды) = Неопределено Тогда

			НайденнаяКоманда = Команды.Найти(Элемент.ИмяКоманды);
			Если НайденнаяКоманда = Неопределено Тогда
				Продолжить;
			КонецЕсли;

			ДействиеКоманды = ?(ЗначениеЗаполнено(НайденнаяКоманда.Действие), НайденнаяКоманда.Действие,
				НайденнаяКоманда.Имя);
			ПредставлениеДействия = Уточнения[ДействиеКоманды];

			Если ПредставлениеДействия = Неопределено Тогда
				ПредставлениеДействия = НайденнаяКоманда.Заголовок;
			КонецЕсли;

			СобытияНастроек.Вставить(ДействиеКоманды, ПредставлениеДействия);

		КонецЕсли;

	КонецЦикла;

КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область ВызовМодуляОбъекта

&НаСервере
Функция ДанныеЭлементаРасшифровки(Знач Расшифровка)
	Возврат РеквизитФормыВЗначение("Отчет").ДанныеЭлементаРасшифровкиВызов(ЭтотОбъект, Расшифровка);
КонецФункции

&НаСервере
Функция НастройкиФормыОтчета(ПараметрыОтчет, КлючТекущегоВарианта, ОтчетОбъект) 
	Возврат РеквизитФормыВЗначение("Отчет").НастройкиФормыОтчетаВызов(ПараметрыОтчет, КлючТекущегоВарианта, ОтчетОбъект);
КонецФункции

#КонецОбласти

#Область ОбработкаРасшифровкиОткрытьФормуСписка

// Обрабатывает выбор пункта меню расшифровки.
//
// Параметры:
//   ВыбранныйЭлемент - ЭлементСпискаЗначений, Неопределено - выбранный пункт меню
//   ДанныеРасшифровки - Структура - данные расшифровки с информацией об объекте метаданных
//
&НаКлиенте
Процедура ОбработкаВыбораДействияРасшифровки(ВыбранныйЭлемент, ДанныеРасшифровки) Экспорт
	
	Если ВыбранныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если ВыбранныйЭлемент.Значение = "ОткрытьСписок" Тогда
		ОткрытьФормуСпискаОбъектаМетаданных(ДанныеРасшифровки);
	КонецЕсли;
	
КонецПроцедуры

// Открывает форму списка для указанного объекта метаданных.
//
// Параметры:
//   ДанныеРасшифровки - Структура - данные расшифровки с полями:
//     * ВидОбъекта - Строка - тип объекта метаданных (Справочник, Документ и т.д.)
//     * ИмяОбъекта - Строка - имя объекта метаданных
//
&НаКлиенте
Процедура ОткрытьФормуСпискаОбъектаМетаданных(ДанныеРасшифровки)
	
	ВидОбъекта = ДанныеРасшифровки.Отбор.Получить("ВидОбъекта");
	
	Если ДанныеРасшифровки.Поле = "СинонимОбъекта"
		Или ДанныеРасшифровки.Поле = "Количество" Тогда
		ИмяОбъекта = ДанныеРасшифровки.Отбор.Получить("ИмяОбъекта");
	ИначеЕсли ДанныеРасшифровки.Поле = "ИмяОбъекта" Тогда 
		ИмяОбъекта = ДанныеРасшифровки.Значение;
	Иначе 
		ИмяОбъекта = "";
	КонецЕсли;
	
	ИмяТипа = ПолучитьТип(ВидОбъекта);
	ПолноеИмяФормыСписка = ПолучитьИмяФормы(ИмяТипа, ИмяОбъекта);
	
	Если ПолноеИмяФормыСписка <> Неопределено Тогда
		ОткрытьФорму(ВидОбъекта + "." + ИмяОбъекта + "." + "Форма" + "." + ПолноеИмяФормыСписка);
	Иначе
		Попытка 
			ОткрытьФорму(ВидОбъекта + "." + ИмяОбъекта + ".ФормаСписка");
		Исключение
			ТекстСообщения = СтрШаблон("Не удалось открыть форму для объекта метаданных: %1.%2", 
				ВидОбъекта, ИмяОбъекта);
			ПоказатьПредупреждение(, ТекстСообщения);
		КонецПопытки;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Функция НеобходимыеОтборыНайдены(Знач Данные)
	Возврат ТипЗнч(Данные) = Тип("Структура")  
		И Данные.Отбор.Количество()
		И Не ПустаяСтрока(Данные.Отбор.Получить("ВидОбъекта"))
		И Не ПустаяСтрока(Данные.Отбор.Получить("ИмяОбъекта"));
	
КонецФункции

&НаСервере
Функция ПолучитьТип(Знач ВидОбъекта)
	ОтчетНаСервере = РеквизитФормыВЗначение("Отчет");
	Возврат ОтчетНаСервере.ПолучитьТип(ВидОбъекта);
КонецФункции

&НаСервере
Функция ПолучитьИмяФормы(Знач ИмяТипа, Знач ИмяОбъекта)
	ОтчетНаСервере = РеквизитФормыВЗначение("Отчет");
	Возврат ОтчетНаСервере.ПолучитьИмяФормы(ИмяТипа, ИмяОбъекта);
КонецФункции  

#КонецОбласти

#КонецОбласти
